﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace iNet.Media
{
	/// <summary>
	/// 實作 IMediaDecodeTaskFactory 介面的基底類別。
	/// </summary>
	public abstract class MediaDecodeTaskFactory : IMediaDecodeTaskFactory
	{
		#region 欄位
		IMediaFormat _DecodingFormat;
		string _Name;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 MediaDecodeTaskFactory 執行個體。
		/// </summary>
		/// <param name="name">工廠名稱，可以為 Null (Visual Basic 為 Nothing)。</param>
		/// <param name="decodingFormat">媒體的解碼格式。</param>
		/// <exception cref="ArgumentNullException">decodingFormat 為 Null (Visual Basic 為 Nothing)。</exception>
		protected MediaDecodeTaskFactory(string name, IMediaFormat decodingFormat)
		{
			if (decodingFormat == null)
				throw new ArgumentNullException("decodingFormat");
			_Name = name;
			_DecodingFormat = decodingFormat;
		}
		#endregion
		#region CreateDecodeTask
		/// <summary>
		/// 建立解碼工作。
		/// </summary>
		/// <param name="source">媒體儲存來源。</param>
		/// <returns>解碼工作。</returns>
		public abstract MediaDecodeTask CreateDecodeTask(MediaStorage source);
		#endregion
		#region DecodingFormat
		/// <summary>
		/// 取得媒體的解碼格式。
		/// </summary>
		public IMediaFormat DecodingFormat
		{
			get
			{
				return _DecodingFormat;
			}
		}
		#endregion
		#region IsSupportedFormat
		/// <summary>
		/// 確認是否支援指定資料流中的媒體格式。
		/// </summary>
		/// <param name="stream">提供媒體的資料流。</param>
		/// <returns>True 表示支援指定的來源中的媒體格式，False 表示不支援。</returns>
		/// <exception cref="ArgumentNullException">stream 為 Null (Visual Basic 為 Nothing)。</exception>
		public bool IsSupportedFormat(Stream stream)
		{
			//確認參數
			if (stream == null)
				throw new ArgumentNullException("stream");

			//確認格式
			return this.IsSupportedFormatCore(stream);
		}
		#endregion
		#region IsSupportedFormatCore
		/// <summary>
		/// 確認是否支援指定資料流中的媒體格式。
		/// </summary>
		/// <param name="stream">提供媒體的資料流。</param>
		/// <returns>True 表示支援指定的來源中的媒體格式，False 表示不支援。</returns>
		protected abstract bool IsSupportedFormatCore(Stream stream);
		#endregion
		#region SupportedMediaDecodeRequests
		/// <summary>
		/// 取得支援的解碼請求組合。
		/// </summary>
		public virtual MediaDecodeRequests SupportedMediaDecodeRequests
		{
			get
			{
				return MediaDecodeRequests.DecodeMetadata | MediaDecodeRequests.DecodeThumbnailImage;
			}
		}
		#endregion
		#region Name
		/// <summary>
		/// 取得工廠名稱。
		/// </summary>
		public virtual string Name
		{
			get
			{
				return _Name;
			}
		}
		#endregion
	}
}
